iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
自我挑戰組

從電子元件到傅立葉轉換 - 那些我有興趣的主題系列 第 12

[Day12] Arduino 與 AVR 學習經驗分享

  • 分享至 

  • xImage
  •  

就算沒有接觸 Arduino,相信在講到 IoT 應用的時候,多少都聽過 Arduino。

Arduino 是一個開源嵌入式的硬體平台,以往要開發硬體電路時,往往需要編譯程式後燒錄到 IC 上。然而 Arduino 設計了一套電路,讓使用者可以用非常簡單的方式撰寫程式碼並達成功能。

由於它是開源的電路設計,任何人只要有對應的電子元件,電路圖給 PCB 廠印出後誰都可以自己做一塊 Arduino。

Yes

除了提供電路板之外,Arduino 厲害的地方在於它成熟的生態圈跟整合,例如不需要透過特別的燒錄器,只要用 USB 接到電腦就可以上傳程式碼;容易使用的 GPIO 接腳、包裝完整的函式庫,這些對想要接觸 IoT 的初學者來說是非常友善的。

舉例來說,如果想要做一個 LED 閃爍的功能,只要這樣寫:

void setup() {
 pinMode(LED_BUILTIN, OUTPUT); 
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

setup 函數只會執行一次,在電路接電時執行,之後會不斷執行 loop 裡面的程式碼。digitalWritedelay 都是 Arduino 提供的內建函數。digitalWrite 可以將指定的接腳改為指定的電位,由於是 digital,所以只有 HIGH 跟 LOW。

動機

在剛入門時,我學 Arduino 的目的很簡單,是想要自動化一些東西,自己實現一些好玩的創意。

像是透過 Arduino 讀取二氧化碳數據,並搭配 MQTT 與 Grafana 做到簡易視覺化。

又或是整合藍芽做了簡易的 Pomodoro。

Yes

透過藍芽連動行事曆的資訊。

雖然都是非常簡陋的實作,不過 Arduino 的包裝大幅簡化了開發成本,對硬體認知有限的我來說只要有點子,搭配麵包板跟跳線就能夠輕易實現。

學習建議

然而,到了一定程度以後,我也蠻建議想要更近一步學習的人,去學更多關於硬體的知識,甚至是去理解 AVR。

因為 Arduino 寫到後面,很像是找到對的函式庫跟把這些函式庫兜起來達成自己想要的功能。這其實跟一般軟體工程師在做的事情很像。

舉例來說:digitalWrite 雖然可以改變電位,但背後是怎麼實現的呢?delay 可以延遲,那背後又是怎麼做到的?如果不去理解這些東西,只是用別人包好的函數,那麼能夠學到的東西很有限。

如果去深入研究的話,就會知道原來 digitialWrite 背後是去指定特定的暫存器的值來達到的;而 delay 背後的實作是透過 timer 功能來達成。在 AVR 的 IC 當中有數個 timer 可以使用,所以實際的秒數其實是用頻率與週期算出來的。

光是深入研究這兩個函數,就可以發現完全不一樣的世界。例如如果直接用 delay 的話其實是將 MCU blocking 住。

那要怎麼不讓它被 blocking 住呢?這時候就會開始研究中斷(interrupt)是怎麼運作的。我們可以將 delay 改為用中斷的方式執行,當 timer 時間到時直接送出中斷。如果要什麼功能就是直接找函式庫的話,我可能就不會知道這些原理和知識了。

為什麼是 Arduino 與 AVR?

比起直接看 intel 或是 ARM 指令集,AVR 的指令集相對少很多,打開 Attiny85 的 datasheet 也就 120 個指令,在學習上也就相對好上手。以 Attiny85 的 datasheet 為例,整個 datasheet 也才 234 頁,還算是相對好消化的範圍。

除了可以直接用 Arduino 來學習 AVR 之外,對於比較進階的學習者來說也可以直接買單顆 IC 來學習。以 Attiny85 為例,只有 8 隻腳而且可以直接插麵包板接線,想要測試程式碼運作時相對方便許多。Attiny85 只要 50 ~ 60 台幣就能入手,網路上隨便都買得到,比一杯飲料還便宜,燒掉也不會太心疼。


上一篇
[Day11] Advent of Code Day10 與 Racing the beam
下一篇
[Day13] 硬體的世界大不同 – UART
系列文
從電子元件到傅立葉轉換 - 那些我有興趣的主題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言